// 配置路由的地方
import Vue from 'vue';
import VueRouter from 'vue-router'
import routes from './routes'
// 引入store
import store from '@/store/index'
// 使用插件
Vue.use(VueRouter)

// 先把VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace

// 重写push|replace
// 第一个参数：告诉原来的push方法，你往哪里跳转(传递那些参数)
// 第二个参数：成功的回调
// 第三个参数：失败的回调
VueRouter.prototype.push = function(location,resolve,reject){
    if(resolve && reject){
      // call||apply区别：
      // 相同点：都可以调用函数一次，都可以篡改函数的上下文一次
      // 不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
      originPush.call(this,location,resolve,reject)
    }else{
      originPush.call(this,location,()=>{},()=>{})
    }
}

// 重写replace
VueRouter.prototype.replace = function(location,resolve,reject){
  if(resolve && reject){
    originReplace.call(this,location,resolve,reject)
  }else{
    originReplace.call(this,location,()=>{},()=>{})
  }
}

// 配置路由
let router =  new VueRouter({
  // 配置路由
  routes,
  // 滚动行为(控制这滚动条水平方向)
  scrollBehavior (to, from, savedPosition) {
    // 返回的 y = 0 代表滚动条在最上方
    return {y:0}
  }
})

// 全局守卫:前置守卫(在路由跳转之前进行判断)
router.beforeEach(async (to,from,next)=>{
  // to:可以获取到你要跳转到那个路由信息
  // from:可以获取到你从那个路由来的信息
  // next:放行函数  next()放行  next('/login') 放行到指定路由 
  // next(false)路由有改变就跳转到
  let token = store.state.user.token
  // 用户的信息
  let name = store.state.user.userInfo.name

  if(token){
    // 用户已经登录了,不能让他去login[停留在首页]
    if(to.path == '/login'){
      next('/home')
    }else{
      // 登录了但去的不是login[home/search/shopcart,detail]页面
      // 如果用户信息已有
      if(name){
        next()
      }else{
        // 没有用户信息,派发action，让用户信息有，在跳转
        try{
          // 获取用户信息成功
          await store.dispatch('getUserInfo')
          next()
        }catch(e){
          // token失效了获取不到用户信息，重新登陆
          // 清除现在的token
          await store.dispatch('userLogout')
          next('/login')
        }
      }
    }
  }else{
    // 用户未登录:不能去交易相关的页面、不能去支付相关的【pay,paysuccess】、不能去个人中心
    // 如果用户未登录点击这些页面，就导去login页面
    let toPath = to.path
    // indexOf()  如果要检索的字符串值没有出现，则该方法返回 -1。
    if(toPath.indexOf('/trade')!=-1 || toPath.indexOf('/pay') !=-1 || toPath.indexOf('/center')!=-1 || toPath.indexOf('/add')!=-1){
      // 把未登录的时候想去而没有去成的信息，放在地址栏中【路由】
      next('/login?redirect='+toPath)
    }else{
      // 没去这些页面就放行
      next()
    }

  }
})

export default router